﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using MedicalManagementSystem.Utils;

namespace MedicalManagementSystem.Models
{
    public partial class Doctor : IValidatable
    {
        public static Doctor GetByPK(int id)
        {
            return DbContext.Instance.Doctor.Where(doctor => doctor.id == id).FirstOrDefault();
        }

        public string Initials
        {
            get { return string.Format("{0} {1} {2}", Surname, Name, Patronymic); }
        }

        public bool IsDoctorUnique()
        {
            var doctorName = (from doctor in DbContext.Instance.Doctor
                              where (doctor.Surname == Surname && doctor.Name == Name
                                    && doctor.Patronymic == Patronymic && doctor.Post == Post)
                              select doctor).FirstOrDefault();
            return doctorName == null || doctorName == this;
        }

        public bool CanBeDeleted()
        {
            return DbContext.Instance.PatientChart.Where(chart => chart.Doctor.id == this.id)
                       .Count() == 0;
        }

        public bool CheckBeforeSave()
        {
            return GetRuleViolations().Count() == 0;
        }

        public IEnumerable<IRuleViolation> GetRuleViolations()
        {
            if (string.IsNullOrEmpty(Surname))
            {
                yield return new RuleViolation("Фамилия не может быть пустой", this, "Surname", Surname);
            }
            else
            {
                if (Surname != Surname.Trim())
                {
                    yield return new RuleViolation("Фамилия не может начинаться/заканчиваться пробельными символами",
                        this, "Surname", Surname);
                    yield break;
                }
            }
            if (string.IsNullOrEmpty(Name))
            {
                yield return new RuleViolation("Имя не может быть пустым", this, "Name", Name);
            }
            else
            {
                if (Name != Name.Trim())
                {
                    yield return new RuleViolation("Имя не может начинаться/заканчиваться пробельными символами",
                        this, "Name", Name);
                    yield break;
                }
            }
            if (string.IsNullOrEmpty(Patronymic))
            {
                yield return new RuleViolation("Отчество не может быть пустым", this, "Patronymic", Patronymic);
            }
            else
            {
                if (Patronymic != Patronymic.Trim())
                {
                    yield return new RuleViolation("Отчество не может начинаться/заканчиваться пробельными символами",
                        this, "Patronymic", Patronymic);
                    yield break;
                }
            }
            if (string.IsNullOrEmpty(Post))
            {
                yield return new RuleViolation("Должность не может быть пустой", this, "Post", Post);
            }
            else
            {
                if (Post != Post.Trim())
                {
                    yield return new RuleViolation("Должность не может начинаться/заканчиваться пробельными символами",
                        this, "Post", Post);
                    yield break;
                }
                if (!IsDoctorUnique())
                {
                    yield return new RuleViolation("Этот врач уже существует", this, "Surname", Surname);
                }
            }

            yield break;
        }
    }
}
